"""
用户设置数据模型

定义用户个性化设置相关的数据库表结构。
包含用户偏好设置、默认模型配置、标题生成设置等。

主要功能：
1. 用户个性化设置管理
2. 默认模型配置存储
3. 标题生成模型设置
4. 用户偏好设置持久化

作者: LLM Chat System
版本: 1.0.0
"""

from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, ForeignKey, JSON
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.database import Base


class UserSettings(Base):
    """
    用户设置表模型
    
    存储用户的个性化设置，包括默认模型、标题生成模型等配置。
    每个用户只能有一条设置记录。
    """
    
    __tablename__ = "user_settings"  # 数据库表名
    
    # ==================== 主键和关联字段 ====================
    id = Column(
        Integer, 
        primary_key=True, 
        index=True, 
        comment="设置记录ID"
    )
    user_id = Column(
        Integer, 
        ForeignKey("users.id"), 
        nullable=False, 
        unique=True,
        comment="用户ID，与用户表一对一关联"
    )
    
    # ==================== 默认模型设置 ====================
    default_model_id = Column(
        Integer, 
        ForeignKey("model_configs.id"),
        comment="默认聊天模型ID"
    )
    title_generation_model_id = Column(
        Integer, 
        ForeignKey("model_configs.id"),
        comment="标题生成模型ID"
    )
    
    # ==================== 聊天设置 ====================
    auto_title_generation = Column(
        Boolean, 
        default=True, 
        comment="是否启用自动标题生成"
    )
    title_generation_threshold = Column(
        Integer, 
        default=3, 
        comment="标题生成阈值，对话消息数达到此值时生成标题"
    )
    
    # ==================== 界面设置 ====================
    theme = Column(
        String(20), 
        default="light", 
        comment="主题设置：light/dark"
    )
    language = Column(
        String(10), 
        default="zh-CN", 
        comment="界面语言设置"
    )
    font_size = Column(
        Integer, 
        default=14, 
        comment="字体大小设置"
    )
    
    # ==================== 其他设置 ====================
    auto_save = Column(
        Boolean, 
        default=True, 
        comment="是否自动保存对话"
    )
    max_conversations = Column(
        Integer, 
        default=50, 
        comment="最大对话数量限制"
    )
    enable_chain_of_thought = Column(
        Boolean, 
        default=False, 
        comment="是否启用思维链模式"
    )
    
    # ==================== 扩展设置 ====================
    extra_settings = Column(
        JSON, 
        comment="扩展设置，存储其他个性化配置"
    )
    
    # ==================== 时间戳字段 ====================
    created_at = Column(
        DateTime(timezone=True), 
        server_default=func.now(), 
        comment="设置创建时间"
    )
    updated_at = Column(
        DateTime(timezone=True), 
        server_default=func.now(), 
        onupdate=func.now(), 
        comment="设置最后更新时间"
    )
    
    # ==================== 关系映射 ====================
    # 与用户表的一对一关系
    user = relationship("User", back_populates="settings", lazy="select")
    # 与默认模型的关系
    default_model = relationship("ModelConfig", foreign_keys=[default_model_id], lazy="select")
    # 与标题生成模型的关系
    title_generation_model = relationship("ModelConfig", foreign_keys=[title_generation_model_id], lazy="select")
    
    def __repr__(self):
        """
        对象的字符串表示
        
        用于调试和日志记录，显示用户设置的关键信息。
        
        Returns:
            str: 格式化的用户设置信息字符串
        """
        return f"<UserSettings(id={self.id}, user_id={self.user_id}, auto_title_generation={self.auto_title_generation})>"
